// import 'package:camera/camera.dart';
// import 'package:flutter/material.dart';
// import 'package:mediapipe_task_vision/mediapipe_task_vision.dart';
// import 'package:mediapipe_task_vision/pose_landmarker.dart';
// import 'package:mediapipe_task_vision_example/footstep/footstep.dart';
// import 'package:mediapipe_task_vision_example/footstep/footstep2.dart';
// import 'package:mediapipe_task_vision_example/main.dart';
// import 'package:mediapipe_task_vision_example/page/p2p_connect.dart';
// import 'package:mediapipe_task_vision_example/painter/PosePainter.dart';
//
// class PoseLiveWidget extends StatefulWidget {
//   final query;
//
//   const PoseLiveWidget({super.key, this.query});
//
//   @override
//   State<PoseLiveWidget> createState() => _PoseLiveWidgetState();
// }
//
// class _PoseLiveWidgetState extends State<PoseLiveWidget>
//     implements ResultListener {
//   late CameraController controller;
//   var map;
//   var currentStep = StepType.unknown;
//   List<int> footCount = [0, 0, 0, 0];
//   var leftFootStep = FootStep2();
//   var rightFootStep = FootStep2();
//   bool isFrontCamera = true;
//   P2PConnection? p2pConnection;
//   StepAdapter? stepAdapter;
//
//   @override
//   void initState() {
//     super.initState();
//     isFrontCamera = widget.query["isFrontCamera"] == "true" ? true : false;
//     p2pConnection = P2PConnection(widget.query["ip"])..connect();
//     initMediapipe();
//     initCamera();
//   }
//
//   void _sendMsg(StepType stepType, KeyType keyType) {
//     if (stepType != StepType.unknown) {
//       footCount[stepType.index] = footCount[stepType.index] + 1;
//     }
//     currentStep = stepType;
//     int keyCode = -1;
//     switch (stepType) {
//       case StepType.left:
//         keyCode = 37;
//         break;
//       case StepType.down:
//         keyCode = 40;
//         break;
//       case StepType.up:
//         keyCode = 38;
//         break;
//       case StepType.right:
//         keyCode = 39;
//         break;
//       default:
//     }
//     if (keyCode == -1) {
//       return;
//     }
//     var map = {
//       "openType": keyType.toString().split(".")[1],
//       "keyCode": keyCode
//     };
//     p2pConnection!.send(map);
//   }
//
//   initCamera() async {
//     controller = CameraController(
//         cameras[isFrontCamera ? 1 : 0], ResolutionPreset.medium,
//         enableAudio: false, imageFormatGroup: ImageFormatGroup.nv21);
//     controller.initialize().then((_) {
//       if (!mounted) {
//         return;
//       }
//       setState(() {});
//       controller.startImageStream((CameraImage image) {
//         MediapipeTaskVision.getInstance.poseLandmarker().detectLiveStream(
//             image.planes[0].bytes, image.width, image.height, isFrontCamera);
//       });
//     }).catchError((Object e) {
//       if (e is CameraException) {
//         switch (e.code) {
//           case 'CameraAccessDenied':
//             break;
//           default:
//             break;
//         }
//       }
//     });
//   }
//
//   initMediapipe() {
//     leftFootStep.setStepListener(
//         MyFootStepListener((stepType, keyType) => _sendMsg(stepType, keyType)));
//     rightFootStep.setStepListener(
//         MyFootStepListener((stepType, keyType) => _sendMsg(stepType, keyType)));
//     stepAdapter = StepAdapter();
//     leftFootStep.setStepAdapter(stepAdapter!);
//     rightFootStep.setStepAdapter(stepAdapter!);
//     var config = PoseConfig()
//       ..runningMode = "live"
//       ..delegate = 1
//       ..minPoseDetectionConfidence = 0.5
//       ..minPosePresenceConfidence = 0.9
//       ..minPoseTrackingConfidence = 0.5
//       ..numPoses = 1
//       ..outputSegmentationMasks = false;
//     MediapipeTaskVision.getInstance.poseLandmarker().init(config);
//     MediapipeTaskVision.getInstance.setResultListener(this);
//   }
//
//   @override
//   void dispose() {
//     p2pConnection!.close();
//     controller.stopImageStream();
//     controller.dispose();
//     MediapipeTaskVision.getInstance.poseLandmarker().close();
//     super.dispose();
//   }
//
//   @override
//   Widget build(BuildContext context) {
//     Size size = MediaQuery.of(context).size;
//     if (!controller.value.isInitialized) {
//       return Container();
//     }
//     return Scaffold(
//       appBar: AppBar(title: Text(widget.query["ip"])),
//       body: Stack(children: [
//         CameraPreview(controller),
//         // Container(color: Colors.black, height: double.infinity,),
//         map != null
//             ? Positioned(
//                 left: 0,
//                 top: 0,
//                 child: Transform(
//                     alignment: Alignment.center,
//                     transform: Matrix4.identity()..scale(-1.0, 1.0, 1.0),
//                     child: CustomPaint(
//                         size: size,
//                         painter: DDRPainter(
//                             map["landmarks"],
//                             map["inputImageWidth"],
//                             map["inputImageHeight"],
//                             currentStep,
//                             stepAdapter))))
//             : Container(),
//         map != null
//             ? Positioned(
//                 left: 0,
//                 top: 0,
//                 child: Builder(builder: (BuildContext context) {
//                   List landmarks = map["landmarks"];
//                   if (landmarks.isEmpty) {
//                     return Container();
//                   }
//                   return Column(
//                       crossAxisAlignment: CrossAxisAlignment.start,
//                       mainAxisSize: MainAxisSize.min,
//                       children: [
//                         // Text(
//                         //     "${footCount[StepType.left.index].toString()} ${footCount[StepType.down.index].toString()} ${footCount[StepType.up.index].toString()} ${footCount[StepType.right.index].toString()}",
//                         //     style: const TextStyle(
//                         //         color: Colors.white, fontSize: 48)),
//                         // Text("inferenceTime:${map["inferenceTime"].toString()}",
//                         //     style: const TextStyle(
//                         //         color: Colors.white, fontSize: 36)),
//                       ]);
//                 }))
//             : Container()
//       ]),
//     );
//   }
//
//   Widget landmarkStr(landmark) {
//     return Container(
//         padding: const EdgeInsets.all(10),
//         child: Text(
//             "x:${landmark["x"].toStringAsFixed(1)} y:${landmark["y"].toStringAsFixed(1)}",
//             style: const TextStyle(color: Colors.white, fontSize: 48)));
//   }
//
//   @override
//   void onError(String error) {}
//
//   @override
//   void onResults(Object result) {
//     if (!mounted) {
//       return;
//     }
//     map = result as Map;
//     if ((map["landmarks"] as List).isNotEmpty) {
//       if (isFrontCamera) {
//         int imgWidth = map["inputImageWidth"];
//         int imgHeight = map["inputImageHeight"];
//         var landmarks = map["landmarks"];
//         var foot32Pos = Position(landmarks[32]["x"]/imgWidth, landmarks[32]["y"]/imgHeight);
//         var foot31Pos = Position(landmarks[31]["x"]/imgWidth, landmarks[31]["y"]/imgHeight);
//         var foot30Pos = Position(landmarks[30]["x"]/imgWidth, landmarks[30]["y"]/imgHeight);
//         var foot29Pos = Position(landmarks[29]["x"]/imgWidth, landmarks[29]["y"]/imgHeight);
//         var leftHip = Position(landmarks[24]["x"]/imgWidth, landmarks[24]["y"]/imgHeight);
//         var rightHip = Position(landmarks[23]["x"]/imgWidth, landmarks[23]["y"]/imgHeight);
//         var leftShoulder = Position(landmarks[12]["x"]/imgWidth, landmarks[12]["y"]/imgHeight);
//         var rightShoulder = Position(landmarks[11]["x"]/imgWidth, landmarks[11]["y"]/imgHeight);
//
//         var leftFoot = Position(
//             (foot32Pos.x + foot30Pos.x) / 2, (foot32Pos.y + foot30Pos.y) / 2);
//         var rightFoot = Position(
//             (foot31Pos.x + foot29Pos.x) / 2, (foot31Pos.y + foot29Pos.y) / 2);
//         if ((rightFoot.x - leftFoot.x).abs() < StepAdapter.STEP_IS_VERTICAL) {
//           if (leftFoot.y > rightFoot.y) {
//             rightFoot = Position(leftFoot.x, rightFoot.y);
//           } else {
//             leftFoot = Position(rightFoot.x, leftFoot.y);
//           }
//         }
//         stepAdapter!.update(leftHip, rightHip, leftShoulder, rightShoulder);
//         leftFootStep.update(leftFoot);
//         rightFootStep.update(rightFoot);
//         setState(() {});
//       }
//       // else {
//       // p2pConnection!.send(map);
//       // }
//     }
//   }
// }
//
// class MyFootStepListener implements FootStepListener {
//   final Function(StepType stepType, KeyType keyType) onStep;
//
//   MyFootStepListener(this.onStep);
//
//   @override
//   void step(StepType stepType, KeyType keyType, Position position) {
//     onStep(stepType, keyType);
//   }
// }
